#include <iostream>
#include <stdexcept>

template <typename T>
class DynamicArray {
private:
	T* arr;          // 动态数组
	int capacity;    // 数组的容量
	int size;        // 当前数组的大小

	// 增加容量
	void resize() {
		capacity = (capacity == 0) ? 1 : capacity * 2;  // 初始容量为1，之后容量翻倍
		T* newArr = new T[capacity];
		for (int i = 0; i < size; ++i) {
			newArr[i] = arr[i];
		}
		delete[] arr;
		arr = newArr;
	}

public:
	// 构造函数
	DynamicArray() : arr(NULL), capacity(0), size(0) {}

	// 析构函数
	~DynamicArray() {
		delete[] arr;
	}

	// 获取当前数组大小
	int GetSize() const {
		return size;
	}

	// 添加元素
	void Add(const T& value) {
		if (size == capacity) {
			resize();  // 如果数组已满，扩大容量
		}
		arr[size++] = value;
	}

	// 获取指定索引的元素
	T& Get(int index) {
		if (index < 0 || index >= size) {
			throw std::out_of_range("Index out of range");
		}
		return arr[index];
	}

	// 设置指定索引的元素
	void Set(int index, const T& value) {
		if (index < 0 || index >= size) {
			throw std::out_of_range("Index out of range");
		}
		arr[index] = value;
	}

	// 删除指定索引的元素
	void RemoveAt(int index) {
		if (index < 0 || index >= size) {
			throw std::out_of_range("Index out of range");
		}
		for (int i = index; i < size - 1; ++i) {
			arr[i] = arr[i + 1];
		}
		--size;
	}


	// 打印数组
	void Print() const {
		for (int i = 0; i < size; ++i) {
			std::cout << arr[i] << " ";
		}
		std::cout << "\n";
	}
};

int main() {
	DynamicArray<int> arr;

	arr.Add(10);
	arr.Add(20);
	arr.Add(30);
	arr.Print(); // 输出: 10 20 30

	arr.Set(1, 50);
	arr.Print(); // 输出: 10 50 30

	std::cout << "index 0的值: " << arr.Get(0) << "\n";// 输出: 10

	arr.RemoveAt(1);
	arr.Print(); // 输出: 10 30


	return 0;
}
